var readline = require('readline-sync')
readline.setDefaultOptions({ prompt: '' })
var readline = readline.prompt
let [n, m] = readline().split(' ').map((item) => parseInt(item)) // 转成数字
let dp = new Array(n).fill(0).map(() => new Array(2).fill(0)) // dp[i][j] 表示i层的j个们打开的时间
dp[0][0] = 0
dp[0][1] = 0 // 第0层的第一个们打开的时间都是0
let colors = []
for (let i = 0; i < n; i++) {
  let [color1, color2] = readline().split(' ').map((item) => parseInt(item)) // 读出两个颜色
  colors.push([color1, color2]) // 形成所有的颜色数组
}
for (let i = 1; i < n; i++) { // 从第二层开始遍历
  for (let j = 0; j < 2; j++) { // 从第一个们开始遍历
    if (colors[i][j] === colors[i - 1][0] && colors[i][j] === colors[i - 1][1]) {
      // 如果这个颜色是上一个们的俩颜色
      dp[i][j] = Math.min(dp[i - 1][0], dp[i - 1][1]) // 这个的花费就是上一个的花费的最小值
    } else if (colors[i][j] === colors[i - 1][0]) { // 如果和第一个相同
      dp[i][j] = Math.min(dp[i - 1][0], dp[i - 1][1] + colors[i - 1][1] * colors[i][j]) // 这个划分就是上个的花费 和 上个的另一个的花费 + 上个的另一个的颜色 * 当前的这个颜色
    } else if (colors[i][j] === colors[i - 1][1]) { // 如果和第二个相同
      dp[i][j] = Math.min(dp[i - 1][1], dp[i - 1][0] + colors[i - 1][0] * colors[i][j])
    } else { // 如果都不相同 那么这个的花费就是上一个乘这个 下一个乘这个的最小值
      dp[i][j] = Math.min(dp[i - 1][0] + colors[i - 1][0] * colors[i][j], dp[i - 1][1] + colors[i - 1][1] * colors[i][j])
    }
  }
}
// console.table(dp)
let result = Math.min(dp[n - 1][0], dp[n - 1][1])
console.log(result)